'use strict';

module.exports = core;

const semver = require('semver');
const colors = require('colors/safe');
const userHome = require('user-home');
const commander = require('commander');
const pathExists = require('path-exists').sync;
const log = require('@gjs-cli-dev/log');
const pkg = require('../package.json');
const path = require('path');
const init = require('@gjs-cli-dev/init');
const exec = require('@gjs-cli-dev/exec');


const constant = require('./const');
let args, config;

const program = new commander.Command();
async function core() {
    try{
        await prepare();
        // checkPkgVersion();
        // checkNodeVersion();
        // checkRoot();
        // checkUserHome();
      //   checkEnv();
      // await  checkGlobalUpdate();
      registerCommand()
    } catch (e) {
        log.error(e.message);
        if(program.debug){
          console.log(e)
        }
    }
}

function registerCommand(){
  program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false)
    .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '');
  program
    .command('init [projectName]')
    .option('-f, --force', '是否强制初始化项目')
    .action(exec);
    // 开启debug模式
  program.on('option:debug', function() {
    if (program.debug) {
      process.env.LOG_LEVEL = 'verbose';
    } else {
      process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;
  });

  // 指定targetPath
  program.on('option:targetPath', function() {
    // console.log(program.targetPath);
    process.env.CLI_TARGET_PATH = program.targetPath;
  });

  // 对未知命令监听
  program.on('command:*', function(obj) {
    console.log(obj)
    const availableCommands = program.commands.map(cmd => cmd.name());
    console.log(colors.red('未知的命令：' + obj[0]));
    if (availableCommands.length > 0) {
      console.log(colors.red('可用命令：' + availableCommands.join(',')));
    }
  });

  program.parse(process.argv);

  if (program.args && program.args.length < 1) {
    program.outputHelp();
    // console.log();
  }
}

async function prepare() {
  checkPkgVersion();
  checkRoot();
  checkUserHome();
  checkEnv();
  await checkGlobalUpdate();
}

async function checkGlobalUpdate(){
  // 1.获取当前版本号和模块名
  const currentVersion = pkg.version;
  const npmName = pkg.name;
  // 2.调用npm API, 获取所有版本号
  const { getNpmSemverVersion } = require('@gjs-cli-dev/get-npm-info');
  const lastVersion = await getNpmSemverVersion(currentVersion,npmName)
  if (lastVersion && semver.gt(lastVersion, currentVersion)) {
    log.warn(colors.yellow(`请手动更新 ${npmName}，当前版本：${currentVersion}，最新版本：${lastVersion}
                更新命令： npm install -g ${npmName}`));
  }
}

function checkEnv() {
  const dotenv = require('dotenv');
  const dotenvPath = path.resolve(userHome, '.env');
  if (pathExists(dotenvPath)) {
    config = dotenv.config({
      path: dotenvPath,
    });
  }
  createDefaultConfig();
  // log.verbose('环境变量', config, process.env.CLI_HOME_PATH);
}

function createDefaultConfig() {
  const cliConfig = {
    home: userHome,
  };
  if (process.env.CLI_HOME) {
    cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
  } else {
    cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
  }
  process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

// function checkInputArgs() {
//     const minimist = require('minimist');
//     args = minimist(process.argv.slice(2));
//     checkArgs()
//     console.log(args)
// }

// function checkArgs() {
//     if (args.debug) {
//       process.env.LOG_LEVEL = 'verbose';
//     } else {
//       process.env.LOG_LEVEL = 'info';
//     }
//     log.level = process.env.LOG_LEVEL;
//   }

function checkUserHome() {
    console.log(userHome)
    if (!userHome || !pathExists(userHome)) {
      throw new Error(colors.red('当前登录用户主目录不存在！'));
    }
  }

function checkRoot(){
    // console.log(process.geteuid()); (不支持win)
    const rootCheck = require('root-check');
    rootCheck();
}

function checkNodeVersion(){
    // 1. 获取当前Node版本号
    const currentVersion = process.version;
    // 2.比对最低版本号
    const lowestVersion = constant.LOWEST_NODE_VERSION;
    if (!semver.gte(currentVersion, lowestVersion)) {
      throw new Error(colors.red(`gjs-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`));
    }
}

function checkPkgVersion() {
    // log.notice('cli', pkg.version);
}
